package funcs

import (
	"bufio"
	log "github.com/YoungPioneers/blog4go"
	"io"
	"os"
	"regexp"
	"strings"
)

/**
读取白名单（忽略IP列表）
*/
func Read_while_list_file(white_ip_list string) []string {

	//读取白名单文件
	f, err := os.OpenFile(white_ip_list, os.O_RDONLY|os.O_CREATE, 0666)
	if err != nil {
		log.Error("读取白名单失败，请检查白名单文件是否存在或是否有权限")
	}
	defer f.Close()
	//将结果放入该切片中
	var result []string
	br := bufio.NewReader(f)
	//使用正则进行检查
	//该正则是排除已#开头的注释行
	exp1 := regexp.MustCompile(`^#.*`)
	//该正则是判断该字符串是一个合法的ip地址，即IP地址是否写的正确
	exp2 := regexp.MustCompile(`[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}`)
	for {
		line, err := br.ReadString('\n')
		if err != nil || err == io.EOF {
			log.Debug("Read_while_list_file函数的读取白名单for循环结束")
			break
		}
		line = strings.TrimSpace(line)
		//排除空行
		if len(line) == 0 {
			continue
		}
		//排除注释行
		if exp1.MatchString(line) {
			continue
		}
		//检查IP地址是否书写正确
		if !exp2.MatchString(line) {
			continue
		}
		result = append(result, line)

	}
	//去重并返回
	return RemoveDuplicateElement(result)

}

/*func Read_black_list_file(black_ip_list string) {
	//读取黑名单文件
	//黑名单中的行样式：10.0.1.69	|	2018-10-02 09:59:16
	f, err := os.OpenFile(black_ip_list, os.O_RDONLY|os.O_CREATE, 0666)
	if err != nil {
		log.Error("读取白名单失败，请检查白名单文件是否存在或是否有权限")
	}
	defer f.Close()

	//将结果放入该切片中
	var result []string
	br := bufio.NewReader(f)
	//使用正则进行检查
	//该正则是排除已#开头的注释行
	//exp1 := regexp.MustCompile(`^#.*`)
	//该正则是判断该字符串是一个合法的ip地址，即IP地址是否写的正确
	//exp2 := regexp.MustCompile(`[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}`)
	for {
		line, err := br.ReadString('\n')
		if err != nil || err == io.EOF {
			break
		}
		line = strings.TrimSpace(line)
		//排除空行
		if len(line) == 0 {
			continue
		}
		//将每行进行切片，进而获取第一个元素为ip地址，第二个元素为时间的切片
		value_trim_slice := strings.Split(string(line), "|")
		//IP地址
		//fmt.Println(strings.TrimSpace(value_trim_slice[0]))
		//时间
		//fmt.Println(strings.TrimSpace(value_trim_slice[1]))
		//bad_ip的开始阻止的时间字符串
		bad_ip:=strings.TrimSpace(value_trim_slice[0])
		result = append(result, line)

	}
	//去重并返回
	return RemoveDuplicateElement(result)



}
*/
//去重类型为[]sting切片重复的元素
func RemoveDuplicateElement(addrs []string) []string {
	result := make([]string, 0, len(addrs))
	temp := map[string]struct{}{}
	for _, item := range addrs {
		if _, ok := temp[item]; !ok {
			temp[item] = struct{}{}
			result = append(result, item)
		}
	}
	return result
}
